DHCP
__TOC__ DHCP from an application perspective To enable DHCP, you must make sure to compile and link in DHCP. You can do this by defining the LWIP_DHCP option in lwipopts.h to 1, which also then adds a field to netif for a pointer to a dhcp struct. The dhcp struct will be allocated during dhcp_start(). In addition, LWIP_UDP must be non-zero, since DHCP is a protocol that runs on UDP. On a simple setup, you will just call dhcp_start(&mynetif); after initializing your interface. Then, to correctly handle leases, DHCP has a couple timed functions that need to be called. However, since some time ago (1.4.0 ?), you only have to call a single function which will handle all timers for all protocols in the stack, so add this to your main loop or equivalent: sys_check_timeouts(); Then, you should check your interface for ''->dhcp->state DHCP_BOUND'', then you are ready to go. For LWIP 2.0 you need to call dhcp_supplied_address(const struct netif *netif) instead If you would need to handle some drastic physical network changes like, for example, a mobile system that can be unplugged and plugged to a different network, you need to inform the DHCP functions of such a situation. This is normally done by the dhcp_network_changed() function. However, the stack takes care of informing not just DHCP but also AUTOIP and IGMP of link changes, so the right calls are: netif_set_link_up(&mynetif); netif_set_link_down(&mynetif); You should tie these to your link state change detection for your interface. If you want to get more involved, here you have more (and probably outdated) information: To use DHCP on an interface, simply use the following commands: * dhcp_start() - start DHCP configuration for an interface. * dhcp_renew() - enforce early lease renewal (not needed normally) * dhcp_release() - release the DHCP lease, usually called before dhcp_stop() * dhcp_stop() - stop DHCP configuration for an interface * dhcp_inform() - inform server of our manual IP address Note: These functions are lwIP core functions. They are not protected against concurrent access. In multithreaded environments, they may be called from the core thread only (aka. the tcpip-thread). When calling from other threads, use the netifapi_dhcp_*() functions defined in the api-module netifapi.c. One option is to take advantage of the phy auto-negotiation. Most phys will generate an interrupt when the link status changes (a valid auto-negotiation has completed, or the cable has disconnected). Processing of the "phy link status changed" interrupt is passed to the tcpip thread (using, for example, tcpip_callback_with_block( HandlePhyInterrupt, NULL, 0) ). Then in HandlePhyInterrupt, if the link is up, make any necessary hardware register adjustments for the auto-negotiated speed, then call dhcp_start. If the link is down, first call netif_set_down( .. ). The other dhcp functions above may not be needed. DHCP support history in lwIP External references * RFC 1531 "Dynamic Host Configuration Protocol" October 1993, obsoleted by RFC 1541 * RFC 1541 "Dynamic Host Configuration Protocol" October 1993, obsoleted by RFC 2131 * RFC 2131 "Dynamic Host Configuration Protocol" March 1997, updated by RFC 3396 * RFC 3396 "Encoding Long Options in the Dynamic Host Configuration Protocol (DHCPv4)" November 2002 See also Category:LwIP Application Developers Manual Category:Page with support notes for version HEAD Category:Page with support notes for version 1.2